package com.little.g.springcloud.mall.notify;

import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.little.g.springcloud.common.utils.JacksonUtil;
import com.little.g.springcloud.mall.dto.SmsResultDTO;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.util.HashMap;
import java.util.Map;

/*
 * 阿里云短信服务
 */
public class AliyunSmsSender implements SmsSender {

	private final Log logger = LogFactory.getLog(AliyunSmsSender.class);

	private String regionId;

	private String accessKeyId;

	private String accessKeySecret;

	private String sign;

	public String getRegionId() {
		return regionId;
	}

	public void setRegionId(String regionId) {
		this.regionId = regionId;
	}

	public String getAccessKeyId() {
		return accessKeyId;
	}

	public void setAccessKeyId(String accessKeyId) {
		this.accessKeyId = accessKeyId;
	}

	public String getAccessKeySecret() {
		return accessKeySecret;
	}

	public void setAccessKeySecret(String accessKeySecret) {
		this.accessKeySecret = accessKeySecret;
	}

	public String getSign() {
		return sign;
	}

	public void setSign(String sign) {
		this.sign = sign;
	}

	@Override
	public SmsResultDTO send(String phone, String content) {
		SmsResultDTO smsResult = new SmsResultDTO();
		smsResult.setSuccessful(false);
		return smsResult;
	}

	@Override
	public SmsResultDTO sendWithTemplate(String phone, String templateId,
			String[] params) {
		DefaultProfile profile = DefaultProfile.getProfile(this.regionId,
				this.accessKeyId, this.accessKeySecret);
		IAcsClient client = new DefaultAcsClient(profile);

		CommonRequest request = new CommonRequest();
		request.setMethod(MethodType.POST);
		request.setDomain("dysmsapi.aliyuncs.com");
		request.setVersion("2017-05-25");
		request.setAction("SendSms");
		request.putQueryParameter("RegionId", this.regionId);
		request.putQueryParameter("PhoneNumbers", phone);
		request.putQueryParameter("SignName", this.sign);
		request.putQueryParameter("TemplateCode", templateId);
		/*
		 * NOTE：阿里云短信和腾讯云短信这里存在不一致 腾讯云短信模板参数是数组，因此短信模板形式如 “短信参数{1}， 短信参数{2}”
		 * 阿里云短信模板参数是JSON，因此短信模板形式如“短信参数{param1}， 短信参数{param2}”
		 * 为了保持统一，我们假定阿里云短信里面的参数是code，code1，code2...
		 *
		 * 如果开发者在阿里云短信申请的模板参数是其他命名，请开发者自行调整这里的代码，或者直接写死。
		 */
		String templateParam = "{}";
		if (params.length == 1) {
			Map<String, String> data = new HashMap<>();
			data.put("code", params[0]);
			templateParam = JacksonUtil.toJson(data);
		}
		else if (params.length > 1) {
			Map<String, String> data = new HashMap<>();
			data.put("code", params[0]);
			for (int i = 1; i < params.length; i++) {
				data.put("code" + i, params[i]);
			}
			templateParam = JacksonUtil.toJson(data);
		}
		request.putQueryParameter("TemplateParam", templateParam);

		try {
			CommonResponse response = client.getCommonResponse(request);
			SmsResultDTO smsResult = new SmsResultDTO();
			smsResult.setSuccessful(true);
			smsResult.setResult(response);
			return smsResult;
		}
		catch (ServerException e) {
			e.printStackTrace();
		}
		catch (ClientException e) {
			e.printStackTrace();
		}

		SmsResultDTO smsResult = new SmsResultDTO();
		smsResult.setSuccessful(false);
		return smsResult;
	}

}
